package cn.wolfcode.wolf2w.redis.util;

import cn.wolfcode.wolf2w.util.Consts;
import lombok.Getter;
import lombok.Setter;

/**
 * 统一管理redis的key（使用枚举类）
 * key的设计：唯一、灵活、可读、时效（使用常量没有时效，而且不够灵活）
 * 使用枚举类的特点：
 *      1、私有构造器，不能使用构造器创建对象
 *      2、枚举类一旦定义完，实例的个数就固定了（每个实例不允许重复-key的唯一；使用方法拼接 -- 灵活、可读；属性time -- 时效）
 */
@Getter
public enum RedisKeys {
    // 累计访问量
    User_All_Access("user_all_access",1L),
    // 今天访问量
    User_Today_Access("user_today_access",-1L),

    // 接口防刷
    BRUSH_PROOF("brush_proof",Consts.BRUSH_PROOF_VAI_TIME * 60),

    // 用户点赞游记的标记(有时效时间)
    USER_TRAVEL_THUMBUP("user_travel_thumbup",-1L),
    // 用户收藏游记id的集合
    USER_TRAVEL_FAVOR("user_travel_favor",-1L),
    // 游记-数据统计（5个量）
    TRAVEL_STATIS_VO("travel_statis_vo",-1L),  // 不设置过期时间

    // 用户点赞攻略的标记(有时效时间)
    USER_STRATEGY_THUMBUP("user_strategy_thumbup",-1L),
    // 用户收藏攻略id的集合
    USER_STRATEGY_FAVOR("user_strategy_favor",-1L),
    // 攻略-数据统计（5个量）
    STRATEGY_STATIS_VO("strategy_statis_vo",-1L),  // 不设置过期时间

    // 用户登录token
    USER_LOGIN_TOKEN("user_login_token",Consts.USER_INFO_TOKEN_VAI_TIME * 60),
    // 短信验证码
    VERIFY_CODE("verify_code", Consts.VERIFY_CODE_VAI_TIME * 60);

    @Setter
    private String prefix;  // key的前缀
    @Setter
    private Long time;  // 有效时间，单位：秒

    private RedisKeys(String prefix,Long time){
        this.prefix = prefix;
        this.time = time;
    }

    // 拼接key
    public String join(String ...value){
        StringBuilder sb = new StringBuilder(80);
        sb.append(this.prefix);
        for (String key : value) {  // 多个值拼接
            sb.append(":").append(key);
        }
        return sb.toString();
    }

    // 验证
    public static void main(String[] args) {
        System.out.println(RedisKeys.VERIFY_CODE.join("123456789","XX","VV"));
    }
}
